Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define CYCLES 10
- //#define RESOLUTION F_CPU / CYCLES / 2^24 = 0.09536743732496
- #define RESOLUTION 0.09536743732496
- // ASM
- void static inline Signal_OUT(const uint8_t *, uint8_t, uint8_t, uint8_t);
- struct signal{
- volatile uint8_t mode; //signal
- volatile uint8_t fr1; //Frequency [0..7]
- volatile uint8_t fr2; //Frequency [8..15]
- volatile uint8_t fr3; //Frequency [16..31]
- volatile uint32_t freq; //frequency value
- volatile uint8_t flag; //if "0"generator is OFF, "1" - ON
- volatile uint32_t acc; //accumulator
- volatile uint8_t ON;
- volatile uint8_t HSfreq; //high speed frequency [1...4Mhz]
- volatile uint32_t deltafreq; //frequency step value
- } SG;
- //const uint8_t sinewave[] __attribute__ ((section (".MySection1"))) = {
- static const uint8_t sinewave[] PROGMEM = {
- 0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
- 0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,
- 0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5,
- 0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,
- 0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,
- 0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,
- 0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3,
- 0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83,
- 0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51,
- 0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,
- 0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a,
- 0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,
- 0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23,
- 0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c,
- 0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c
- };
- const uint8_t *SIGNALS[] = {
- sinewave
- };
- void static inline Signal_OUT(const uint8_t *signal, uint8_t ad2, uint8_t ad1, uint8_t ad0)
- {
- asm volatile(
- "eor r18, r18 ;r18<-0" "\n\t"
- "eor r19, r19 ;r19<-0" "\n\t"
- "1:" "\n\t"
- "add r18, %0 ;1 cycle" "\n\t"
- "adc r19, %1 ;1 cycle" "\n\t"
- "adc %A3, %2 ;1 cycle" "\n\t"
- "lpm ;3 cycles" "\n\t"
- "out %4, r0 ;1 cycle" "\n\t"
- "sbis %5, 2 ;1 cycle if no skip" "\n\t"
- "rjmp 1b ;2 cycles. Total 10 cycles" "\n\t"
- :
- :"r" (ad0),"r" (ad1),"r" (ad2),"e" (signal),"I" (_SFR_IO_ADDR(PORTA)), "I" (_SFR_IO_ADDR(SPCR0))
- :"r18", "r19"
- );
- }
- // --------------------
- SG.fr1 = 0xe8;
- SG.fr2 = 0x03;
- SG.fr3 = 0x00;
- SG.freq=( ((uint32_t)(SG.fr3)<<16) | ((uint32_t)(SG.fr2)<<8) | ((uint32_t)(SG.fr1)) );
- SG.acc = SG.freq / RESOLUTION;
- Signal_OUT(SIGNALS[SG.mode], (SG.acc >> 16), (SG.acc >> 8), SG.acc);
- // ERRORS
- Compiling C: main.c
- avr-gcc -c -mmcu=atmega324p -I. -gdwarf-2 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./main.lst -std=gnu99 -Wundef -MMD -MP -MF .dep/main.o.d main.c -o main.o
- /tmp/ccCDmZHO.s: Assembler messages:
- /tmp/ccCDmZHO.s:317: Error: number must be positive and less than 32
- Makefile:579: recipe for target 'main.o' failed
- make: *** [main.o] Error 1
Add Comment
Please, Sign In to add comment